using System;
using System.IO;
using System.Xml;
using Curriculum.Business.ClasesPersistentes;
using Curriculum.Business.LectorDatos;
using Curriculum.Business.Manejadores;

namespace Curriculum.Business
{
	/// <summary>
	/// Summary description for ExportadorXML.
	/// </summary>
	public class ExportadorXML
	{
		private VersionCurriculo _version;
		private ManejadorAntecedentes _manejadorAntecedentes;
		private ManejadorAtributos _manejadorAtributos;

		public ExportadorXML(VersionCurriculo version)
		{
			_version = version;
		}


		private ManejadorAntecedentes ManejadorAntecedentes
		{			
			get
			{
				if (_manejadorAntecedentes == null)
				{
					_manejadorAntecedentes = ManejadorAntecedentes.GetInstancia(_version.NumeroVersion);
				}
				return _manejadorAntecedentes;
			}
		}

		private ManejadorAtributos ManejadorAtributos
		{
			get
			{
				if (_manejadorAtributos == null)
				{
					_manejadorAtributos = new ManejadorAtributos(_version.NumeroVersion);
				}
				return _manejadorAtributos;
			}
		}


		public void Exportar(string path)
		{			
			StreamWriter streamWriter = new StreamWriter(path);
			XmlTextWriter writer = new XmlTextWriter(streamWriter);
		
			writer.WriteStartDocument();
			writer.WriteStartElement("Curriculum");

			if (_version != null)
			{
				writer.WriteAttributeString("Version", _version.NumeroVersion);
			
				EscribirAntecedentesHijos(writer, _version.AntecedentesPersistentes);			

			}
			
			writer.WriteEndElement();			
			writer.WriteEndDocument();

			streamWriter.Flush();
			streamWriter.Close();
		}


		private void EscribirAntecedentesHijos(XmlWriter nodo, AntecedentesPersistentes listaAntecedentes)
		{
			if (listaAntecedentes != null)
			{
				foreach (AntecedentePersistente ant in listaAntecedentes)
				{
					string nombreAntecedente = ManejadorAntecedentes.GetAntecedente(ant.IdAntecedentePersistente).Nombre;
			
					nodo.WriteStartElement("Antecedente");
					nodo.WriteAttributeString("Nombre",nombreAntecedente);

					EscribirAntecedentesHijos(nodo, ant.AntecedentesPersistentes);

					EscribirAtributos(nodo, ant.AtributosPersistentes);
					nodo.WriteEndElement();
				}
			}			
		}

		private void EscribirAtributos(XmlWriter nodo, AtributosPersistentes listaAtributos)
		{
			if ((listaAtributos != null))
			{	
				string nombreAtributoActual;
				foreach (AtributoPersistente atributo in listaAtributos)
				{
					nombreAtributoActual = ManejadorAtributos.GetAtributo(atributo.IdAtributo).nombre;
					nodo.WriteStartElement("Atributo");
					nodo.WriteAttributeString("Nombre", nombreAtributoActual);
					nodo.WriteString(atributo.Valor);
					nodo.WriteEndElement();					
				}
			}
		}
	}
}
